package com.xyx.www;

public class Test0723 {
	/**
	 * 定义不规则二维数组
	 */
	private static void test01() {
		// 定义声明不规则二维数组
		// 1.
		int[][] arr01 = new int[][] { { 1, 2, 3, 4 }, { 1, 2, 3 }, { 1, 2 } };
		// 2.
		int[][] arr02 = { { 1, 2, 3, 4 }, { 1, 2, 3 }, { 1, 2 } };
		// 3.
		// 先定义行数，3行
		int[][] arr03 = new int[3][];
		// 再定义每行的列数

		// 定义第一行列数为2
		arr03[0] = new int[2];
		// 定义第二行列数为3
		arr03[1] = new int[3];
		// 定义第三行列数为4
		arr03[2] = new int[4];
		// 为一行二列赋值为3
		arr03[0][1] = 3;

		// 二维数组的遍历
		// 外层for循环遍历行数
		for (int i = 0; i < arr03.length; i++) {
			// 内层for循环遍历行数
			for (int k = 0; k < arr03[i].length; k++) {
				// 使用行标和列标取出对应元素的值 arr03[i][k]
				System.out.print(" " + arr03[i][k]);
			}
			// 换行
			System.out.println();
		}
	}

	/**
	 * 定义非变长参数方法
	 */
	private static void test02(int ageA, String nameA) {
		System.out.println("普通方法");
		System.out.println("此处调用的是非变长参数方法");
	}

	/**
	 * 定义变长参数方法
	 */
	private static void test02(int ageA, String... nameA) {
		System.out.println("调用变长参数方法");
		// 如何获取变长参数的内容
		// 变长参数就是一个该数据类型的数组
		System.out.println("变长参数就当成数组进行遍历即可：");
		System.out.println(" " + ageA);
		if (nameA != null) {
			for (String string : nameA) {
				System.out.println(" " + string);
			}
		}
	}

	/**
	 * 在主方法中定义实参调用子方法，验证按值传参和按引用传参的区别
	 */
	private static void test03Main() {
		System.out.println("+++++主方法+++++");
		// 定义数组str1
		int[] str1 = new int[] { 1, 2, 3, 4, 5, 6 };

		// 定义整型值numA
		int numA = 1011;
		System.out.println("调用子方法前实参numA的值为：" + numA);
		test03Sun_01(numA);
		// 实参的值传递给形参，如果形参的值发生了变化，则实参不受影响；
		// 8种基本类型、String是按值传参；【除此以外都是按引用传参】
		System.out.println("调用子方法后实参numA的值为：" + numA);
		System.out.println("调用子方法前实参数组str的值为：");
		printArr(str1);
		test03Sun_02(str1);
		System.out.println("调用子方法后实参数组arr的值为：");
		// 按引用传值
		// 按引用传参；
		// 实参的值传递给形参，如果形参的值发生了变化，则实参受影响；
		// 因为按引用传参传递的是地址（引用），所有形参改变会影响实参；
		// 对象类型（不包括String）、数组按引用传参；
		printArr(str1);
		System.out.println("+++++主方法+++++");

	}

	/**
	 * @param arr
	 *            按引用传值的子方法，传值后在内部修改的值会传回给主方法之中
	 */
	private static void test03Sun_02(int[] arr) {
		System.out.println("++++++子方法开始++++++");
		System.out.println("子方法在主方法获取的数组值为：");
		printArr(arr);
		// 对传值形参的值进行改值
		arr[0] = 1011;
		System.out.println("子方法在主方法获取的数组值在子方法test03Sun_02改为：");
		printArr(arr);
		System.out.println("++++++主方法结束++++++");

	}

	/**
	 * @param num
	 *            按值传值的子方法，实参的值传递给形参，如果形参的值发生了变化，则实参不受影响； 传回去的值还是实参传进去的值，不会改变
	 */
	private static void test03Sun_01(int num) {

		System.out.println("++++++子方法开始++++++");
		System.out.println("在子方法test03Sun_01中形参从实参中获取的值为" + num);
		// 对传进来的值进行+1改变形参的值
		num += 1;
		System.out.println("在子方法test03Sun_01中形参从实参中获取的值改为" + num);
		System.out.println("++++++子方法结束++++++");

	}

	/**
	 * @param arr
	 * 
	 *            循环遍历数组，并打印出来
	 */
	private static void printArr(int[] arr) {
		for (int i : arr) {
			System.out.print(i);
		}
		System.out.println();
	}

	private static void calculatorNum(int[] arr, int i) {
		System.out.print(arr[i] + " ");
		if (i >= arr.length - 1) {
			return;
		} else {
			i++;
			calculatorNum(arr, i);
		}

	}

	/**
	 * 递归求解斐波那契数列的第N项的值
	 * 
	 * @param n
	 *            第n项
	 * @return 第n项的值
	 */
	private static long caculateF(int n) {
		// （1）递归结束条件
		if (n == 1 || n == 2) {
			return 1;
		}
		// （2）递归调用
		return caculateF(n - 2) + caculateF(n - 1);
	}

	public static void main(String[] args) {
		/*
		 * int ageA=20; String nameA="zheng"; System.out.println("普通的方法重载");
		 * test02(ageA,nameA); System.out.println("====================="); //直接传变长参数
		 * System.out.println("调用变长参数"); test02(ageA,"小明","小池","小强","小飞","小华");
		 * System.out.println("====================="); //以数组方式传变长参数 String[] str=
		 * {"小明1","小池1","小强1","小飞1","小华1"}; System.out.println("以数组方式调用变长参数");
		 * test02(ageA,str); System.out.println("====================="); //test01();
		 * //当变长参数方法和非变长参数方法的形参都可以和实参列表匹配时，优先调用非变长参数的方法；
		 * System.out.println("变长参数可以为0个："); test02(77, "小明");
		 */
		// test03Main();
		/*
		 * int []arr01=new int[] {1,2,3,4,5,6}; calculatorNum(arr01,0);
		 */
		System.out.println(caculateF(1));
	}
}
